현우의 개발노트

OpenGL Shader 개념

2018-06-26

OpenGL Shader

Shader 는 vertex 정보들을 화면에 보여질수 있도록 변환하는 작업을 하는 프로그램(명령어 집합)입니다. 스크린 위에 낱개의 픽셀마다 실행되며 이 실행들이 한번에 일어납니다. 이러한 작업은 GPU 에서 일어납니다.

파이프라인을 통해 작업이 줄지어 실행되며 한 Shader 에서 다음 Shader 로 넘어갈때 변수에 데이터를 담아 보내게 됩니다. 변수에 데이터를 담는 규칙은 다음과 같습니다.

  1. 변수의 이름과 타입은 이전 Shader 에서의 그것과 일치합니다.
  2. 파이프라인 구조상 다음에 위치한 Shader 에게만 변수를 전달할 수 있습니다.

Shader 들은 새로운 프로그램을 적용함으로써 알맞게 변형시킬 수 있으며 대표적으로 Vertex Shader, Fragment Shader 를 변형하여 적용합니다. 이에 반해 Vertex Fetch, Rasterization, Buffer Operations 등은 직접 컨트롤할 수 없는 작업입니다.

GLSL

Shader 라는 프로그램을 실행하려면 여기에 맞는 언어를 사용하게 되는데 이 언어를 GLSL(OpenGL Shading Language) 라고 합니다. C 언어를 기반으로 합니다.

Vertex Shader

Vertex Shader 는 3차원 좌표로 이루어진 vertex 들이 2차원 화면에서 그려질 위치를 정의합니다. gl_Position 이란 변수는 미리 정의되어 있는 변수이며 스크린상의 점의 위치를 가리키는 값을 저장하고 있습니다.

1
2
3
4
5
6
7
8
9
void main(void) {
const vec4 vertices[3] =
vec4[3](vec4( 0.25, -0.25, 0.5, 1.0),
vec4(-0.25, -0.25, 0.5, 1.0),
vec4( 0.25, 0.25, 0.5, 1.0));
// 화면에 3개의 점을 그린다.
gl_Position = vertices[gl_VertexID];
}

Fragment Shader

Fragment Shader 는 각각의 픽셀들이 어떤 색상으로 그려질지를 정의합니다. 반환값으로 색상버퍼를 반환하며 색상버퍼에 표현되지 않는 오브젝트들은 전부 검정색으로 표현됩니다. gl_FragColor 는 함수의 반환값으로 사용되는 변수이며 화면에 나타낼 색을 정의합니다.

1
2
3
4
5
6
7
8
#ifdef GL_ES
precision mediump float;
#endif
void main() {
// Vertex Shader 에 의해 정의된 영역을 빨간색으로 칠한다.
gl_FragColor = vec4(1.0,0.0,0.0,1.0);
}

Rendering Pipeline

Vertex Shader 작업 후 Fragment Shader 작업을 진행하기 전 Rasterization 이라는 작업이 있는데 이것은 Vertex Shader 에서 처리된 값들을 Fragment Shader 가 처리 가능한 값으로 변환하는 작업을 담당합니다.

참고자료

The Book of Shaders

GLSL Programming

셰이더를 적용해봅시다.

OpenGL ES를 위한 3D 기본개념

OpenGL ES 2.0 기본 흐름도

GPU 파이프라인 그리고 셰이더

후원

이 포스트가 도움이 되었다고 생각하시면, 위의 버튼을 클릭하여 후원해주세요.

이 포스트를 공유하려면 QR 코드를 스캔하세요.